[小ネタ] Lambda関数で使用しているランタイムの種類とバージョンを全リージョンで一括チェックする (ランタイムのサポート終了に備えよう)
みなさん、こんにちは!
AWS事業本部の青柳@福岡オフィスです。
最近、AWSに登録しているメールアドレス宛てに
[要対応] AWS Lambda における Python 2.7 のサポート終了
とか
[Action Required] AWS Lambda end of support for Python 2.7
とかのタイトルのメールが届いた方は多いのではないでしょうか。
Lambdaで作成した関数は未来永劫使い続けることができる訳ではなく、作成した時に使用した「ランタイム」のサポートが終了する日がいつか訪れます。
「ランタイムサポートポリシー - AWS Lambda」ページによると、記事執筆時 (2021年6月7日) 現在、以下のランタイムのサポート終了が予告されています。
- Python 2.7
- Ruby 2.5
- Node.js 10.x
サポート終了の通知を受け取ったら、まずは、対象のLambda関数を把握することが必要です。
もし、大量のLambda関数を作成して運用していたり、複数リージョンで運用していたりする場合、マネジメントコンソールから確認しようとすると、ページの切り替えやリージョンの切り替えを何度も行わなければならなかったりして、対象のLambda関数を洗い出すのは一苦労です。
そこで、全リージョンの全Lambda関数を一発でリストアップするスクリプトを作ってみました。
Lambda関数ランタイム一括出力スクリプト
スクリプトの内容はこんな感じです。
#!/bin/bash declare -a REGIONS=($(aws ec2 describe-regions --output text --query "sort(Regions[].RegionName)")) for REGION in "${REGIONS[@]}" do echo "${REGION}:" aws lambda list-functions --region ${REGION} --output table --query "sort_by(Functions[].{Name:FunctionName,Runtime:Runtime},&Name)" done
スクリプトを実行すると、こんな感じで出力されます。
$ ./list-lambda-function-all-regions.sh ap-northeast-1: ------------------------------------------- | ListFunctions | +--------------------------+--------------+ | Name | Runtime | +--------------------------+--------------+ | nodejs10-function-tokyo | nodejs10.x | | nodejs12-function-tokyo | nodejs14.x | | python27-function-tokyo | python2.7 | | python36-function-tokyo | python3.6 | | ruby25-function-tokyo | ruby2.5 | | ruby27-function-tokyo | ruby2.7 | +--------------------------+--------------+ ap-northeast-2: ap-northeast-3: ------------------------------------------- | ListFunctions | +--------------------------+--------------+ | Name | Runtime | +--------------------------+--------------+ | nodejs10-function-osaka | nodejs10.x | | nodejs12-function-osaka | nodejs12.x | | python27-function-osaka | python2.7 | | python36-function-osaka | python3.6 | | ruby25-function-osaka | ruby2.5 | | ruby27-function-osaka | ruby2.7 | +--------------------------+--------------+ ap-south-1: ap-southeast-1: ap-southeast-2: ca-central-1: eu-central-1: eu-north-1: eu-west-1: eu-west-2: eu-west-3: sa-east-1: us-east-1: ---------------------------------------------- | ListFunctions | +-----------------------------+--------------+ | Name | Runtime | +-----------------------------+--------------+ | nodejs10-function-virginia | nodejs10.x | | nodejs12-function-virginia | nodejs14.x | | python27-function-virginia | python2.7 | | python36-function-virginia | python3.6 | | ruby25-function-virginia | ruby2.5 | | ruby27-function-virginia | ruby2.7 | +-----------------------------+--------------+ us-east-2: us-west-1: us-west-2:
スクリプトの解説
解説するほどのスクリプトではありませんが、一応解説しておきます。
まず、冒頭のこの部分でAWSの全リージョンを取得して配列変数に格納します。
declare -a REGIONS=($(aws ec2 describe-regions --output text --query "sort(Regions[].RegionName)"))
aws ec2 describe-regions
コマンドをオプションを付けずに実行すると、以下のように出力されます。
$ aws ec2 describe-regions { "Regions": [ { "Endpoint": "ec2.eu-north-1.amazonaws.com", "RegionName": "eu-north-1", "OptInStatus": "opt-in-not-required" }, { "Endpoint": "ec2.ap-south-1.amazonaws.com", "RegionName": "ap-south-1", "OptInStatus": "opt-in-not-required" }, ・・・ { "Endpoint": "ec2.us-west-2.amazonaws.com", "RegionName": "us-west-2", "OptInStatus": "opt-in-not-required" } ] }
OptInStatus
はリージョンの「オプトイン」に関するステータスで、以下の種類があります。
opt-in-not-required |
オプトイン不要でデフォルトで利用可能なリージョン (ap-northeast-1やus-east-1など) |
not-opted-in |
オプトインが必要で、まだオプトインしていないリージョン (ap-east-1(香港)やeu-south-1(ミラノ)など) |
opted-in |
オプトインが必要で、オプトインを行ったリージョン |
aws ec2 describe-regions
コマンドをオプションを付けずに実行した場合に出力されるのは、ステータスがopt-in-not-required
またはopted-in
であるもの、すなわち「このAWSアカウントで利用可能なリージョン」のみが出力されます。
なお、aws ec2 describe-regions
コマンドに--all-regions
オプションを付けて実行するとステータスがnot-opted-in
であるものを含めて全てのリージョンが出力されます。
(今回は、利用可能でないリージョンについて調べる意味が無いので、オプションは付けません)
今回のスクリプトでは、出力フォーマットをtext
形式にした上で、出力結果をRegions[].RegionName
でフィルタリングしてリージョン名のみ抽出し、sort()
で並び替えています。
そうして得られた結果をdeclare -a
コマンドで配列変数に格納しています。
次に、for
文を使って配列変数REGIONS
に格納されたリージョン名を一つずつ取り出して、繰り返し処理を行います。
for REGION in "${REGIONS[@]}" do echo "${REGION}:" aws lambda list-functions --region ${REGION} --output table --query "sort_by(Functions[].{Name:FunctionName,Runtime:Runtime},&Name)" done
aws lambda list-functions
コマンドに--region
オプションを付けて実行することで、指定したリージョンの全Lambda関数を出力します。
出力フォーマットはtable
形式にしていますが、好みで他の形式を指定してもよいでしょう。
出力する項目もシンプルに「関数名」「ランタイム」のみとしていますので、必要に応じて変えてみてください。
対象Lambda関数を確認した後は・・・
AWSの案内に従って、ランタイムの移行など必要な対応を行いましょう。
「Python 2.7」のサポート終了については、下記の記事が参考になると思います。
ということで、「Lambda関数ランタイムのサポート終了」メールが届いたら、今回のスクリプトを使って時間を掛けずに対象Lambda関数をチェックしましょう!